#!/usr/bin/env python
# coding=utf-8

# 上海航空国际旅游
import os, sys, re, traceback, logging
import urllib,httplib
import time
import datetime
import getopt
import urllib2
from urllib2 import URLError
from Route  import *


mainBlock_re = re.compile(r'''
        以下列出为近期主要出行线路，具体出行时间请进入点击查看详情(.*?)共\s*<b>\d*</b>\s*条记录
        ''', re.X|re.S)

vacationBlock_re = re.compile(r'''
        <table\b[^<>]*?>(.*?<div\b[^<>]*?>.*?</div>.*?)</table>
        ''', re.X|re.S)

def do_crawl():
    try:
        server_urls = [
                       ('自由行', 'http://www.satrip.com/FreeTravel/Default.asp'),
                       ('出境游', 'http://www.satrip.com/eTravel/Team.asp')]
        
        pageNum_urls = {'自由行':'http://www.satrip.com/FreeTravel/Default.asp?num='
                        ,'出境游':'http://www.satrip.com/eTravel/Team.asp?Area=&RouteType=&RouteRate=&DouteDay=&RouteOrder=&Keyword=&JgAction=%4A%67%44%6E&TsAction=%54%73%44%6E&TjzAction=%54%6A%7A%44%6E&page='}
        
        title_url_pres = {'自由行':'http://www.satrip.com/FreeTravel/'
                          ,'出境游':'http://www.satrip.com/eTravel/'}
        for vacation_type, server_url in server_urls:
            
            html = urllib2.urlopen(server_url).read()
            html = html.decode("gbk").encode('utf-8')
            
            #获取总页数
            pageNums = int(re.compile(r'''/(\d{1,2})</strong>页''', re.X | re.S).search(html).group(1))
            #根据总页数，遍历所有线路列表页
            for pageNo in range(0, pageNums):
                url = str(pageNum_urls[vacation_type])+str(pageNo+1)
                print url
                html = urllib2.urlopen(url).read()
                html = html.decode("gbk").encode('utf-8')
                
                #获取有用的块
                mainblock = mainBlock_re.findall(html)[0]
        
                #获取所有描述线路的HTML片段 
                vacationBlockList = vacationBlock_re.findall(mainblock)
            
                for div in vacationBlockList:
                    route = Route()
                    #站点ID
                    route.site = '42'
                    #提供商名称
                    route.supplier = '上航旅游'
                    #供应商url
                    route.supplier_url = 'http://www.satrip.com/'
                    #价格
                    route.price = re.compile(u'''(\d+)元?/?人?起''', re.X|re.S).search(div.decode("utf-8")).group(1)
                    #线路标题
                    route.title = re.compile(r'''title="([^"]+)"''', re.X|re.S).search(div).group(1).strip()
                    #线路url
                    route.rout_url = str(title_url_pres[vacation_type]) + re.compile(r'''title=".*?"\s*href="(.*?)"''', re.X|re.S).search(div).group(1)
                    #行程类型
                    route.type =vacation_type  
                    #行程天数
                    days_temp = re.compile(r'''(\d+)(?:天|日)''', re.X|re.S).search(route.title)
                    if days_temp:
                        route.days = days_temp.group(1)    
                    
                    #出发日期
                    if vacation_type=='自由行':
                        datesTemp = re.compile(r'''<p\s*class="blackFont">([^<>]*?\d{4}-\d{1,2}-\d{1,2}[^<>]*?)</\s*p>''', re.X|re.S).search(div)
                        if(datesTemp):
                            route.dates = datesTemp.group(1)
                            route.dates = ';'.join(route.dates.split('/')).replace(' ','')
                        else:
                            route.dates = '天天发团'
                    else:
                        datesTemp = re.compile(r'''出团日期：([^<>]+)''', re.X|re.S).search(div)
                        if(datesTemp):
                            route.dates = datesTemp.group(1)
                            route.dates = getDates(route.dates)
                        else:
                            route.dates = '天天发团'
                        
                    innerHtml = urllib2.urlopen(route.rout_url).read()
                    innerHtml = innerHtml.decode("gbk").encode('utf-8')
                    #出发城市
                    route.outcity = '上海'
                    
                    #到达城市
                    dest_temp = re.compile(u'''第1天&nbsp;\s*上海-*([^\d&;<>（）()]*)''', re.X|re.S).search(innerHtml.decode('utf-8'))
                    if(dest_temp):
                        route.dest = dest_temp.group(1).strip()
                        dest_p = re.compile(u'''—+|－+|-+|/''', re.X|re.S);
                        route.dest = dest_p.split(route.dest)[-1]
                        route.dest = route.dest.encode('utf-8')
                    
                    #出发交通工具
                    route.go_t = '飞机'
                    #回程交通工具
                    route.back_t = '飞机'
                    
                        
                    print >>sys.stderr, 'updating:','， title：',route.title,'， 价格：',route.price, '，交通工具:',route.go_t,'， 天数：',route.days,'， 出发日期：',route.dates,'， 出发城市：',route.outcity,'， 到达城市：',route.dest
                    
                    #进一步解析 
                    if vacation_type=='自由行': 
                        do_parse(innerHtml,route)
                    else:
                        do_parse_e(innerHtml,route)
                    route.updRoute()
                    route.updRoute_Schedules()


    except:
        print traceback.format_exc(sys.exc_info())

'''
    功能：日期转化
    输入为：8/7,8/14,8/21,1/28
    输出为：2010-08-07;2010-08-14;2010-08-21;2011-01-28
''' 
def getDates(str):
    li = [];
    now = datetime.datetime.now()
    dateList = str.split(",")
    for dateStr in dateList:
        mon,day = int(dateStr.split('/')[0]),int(dateStr.split('/')[1])
        theDay = datetime.datetime(now.year,mon,day)
        if theDay < now:
            theDay = datetime.datetime(now.year+1,mon,day)
        ss = theDay.strftime('%Y-%m-%d')
        li.append(ss)
        
    return ";".join(li)

#解析每一天的行程安排----度假
def do_parse(html,route): 
    #描述图片url
    img_temp = re.compile(r'''href="\.*([^"]*?imgView\.asp[^"]*?)">''', re.X|re.S).search(html)
    if img_temp:
        route.img_url = 'http://www.satrip.com/'+img_temp.group(1)
        route.img_url = route.img_url.replace('//','/')
    
    html = re.compile(r'''<form[^<>]*?>(.*?)</form>''', re.X|re.S).search(html).group(1)
    
    #简介
    detail_temp_ = re.compile(r'''<p[^<>]*?class="blackFont"[^<>]*?>(.*?)</p>''', re.X|re.S).search(html)
    if(detail_temp_):
        detail_temp =detail_temp_.group(1)
        #HTML标签
        re_h=re.compile('</?\w+[^>]*>')
        #去掉HTML 标签
        route.detail = re_h.sub('',detail_temp).strip()
    
    htmlTemp = re.compile(r'''推荐行程(.*?)可选酒店列表''', re.X|re.S).search(html)
    if htmlTemp :   
        html =htmlTemp.group(1)
    else :
        # 没有具体行程信息，返回
        return ;
    
    schedule_re =  re.compile(r'''<div[^<>]*?>\s*?<table[^<>]*?>.*?</table>\s*?</div>''', re.X|re.S)
    
    schedule_list = schedule_re.findall(html)
    
    if len(schedule_list)>0:
        route.days = str(len(schedule_list))
        
    for parthtml in schedule_list:
        schedule = Schedule()
        uparthtml= parthtml.strip().decode("utf-8")
        
        #第几天
        schedule.s_num = re.compile(r'''第(\d{1,2})天''', re.X|re.S).search(parthtml).group(1)
        
        #游览地点
        dest_temp = re.compile(u'''第\d{1,2}天&nbsp;\s*[^&;-]*?[-]*([^&;-（]+)''', re.X|re.S).search(uparthtml)
        if dest_temp:
            schedule.s_place = dest_temp.group(1)
            print schedule.s_place
                
        #详细描述
        brief_temp = re.compile(u'''<p\s*class="blackFont"[^<>]*?>(?:&nbsp;)*\s*(.*?)(?:<br>)*\s*</p>''', re.X|re.S).search(parthtml)
        if brief_temp:
            schedule.s_brief = brief_temp.group(1)
            print schedule.s_place
            
        #早餐： 1有、0没有 
        meals =  re.compile(r'''<font\s*color=".961400">\s*(.*?)\s*</font>''', re.X|re.S).findall(parthtml)
        
        if meals:   
            schedule.s_brf = '0' if meals[0].strip() == '自理' else '1'
            schedule.s_lunch = '0' if meals[1].strip() == '自理' else '1'
            schedule.s_dinner = '0' if meals[2].strip() == '自理' else '1'
        
            #酒店描述：可选       
            schedule._hotel = meals[3]
        route.schedules.append(schedule)
    return 

#解析每一天的行程安排 出境
def do_parse_e(html,route): 
    #描述图片url
    img_temp = re.compile(r'''href=["']([^"']*?(?:CTMSWeb|上传文件)[^"']*)''', re.X|re.S).search(html)
    if img_temp:
        route.img_url = img_temp.group(1)    
    
    html_temp = re.compile(r'''参考行程(.*?)行程标准''', re.X|re.S).search(html)
    if html_temp:
        html = html_temp.group(1)
    else:
        # 没有具体行程信息，返回
        if route.days==0:
            route.days =1
        return
    
    schedule_re =  re.compile(r'''<div[^<>]*?>\s*?<table[^<>]*?>.*?</table>\s*?</div>''', re.X|re.S)
    
    schedule_list = schedule_re.findall(html)
    
    if len(schedule_list)>0:
        route.days = len(schedule_list)
        
    for parthtml in schedule_list:
        schedule = Schedule()
        uparthtml= parthtml.strip().decode("utf-8")
        
        #第几天
        schedule.s_num = re.compile(r'''第(\d{1,2})天''', re.X|re.S).search(parthtml).group(1)
        
        #游览地点
        dest_temp = re.compile(u'''第\d{1,2}天&nbsp;\s*([^&;<>（]*)''', re.X|re.S).search(uparthtml)
        if dest_temp:
            dest_p = re.compile(r'''-|/''', re.X|re.S);
            schedule.s_place = dest_p.split(dest_temp.group(1))[-1]
            
        dest_p = re.compile(r'''-|/''', re.X|re.S);
        route.dest = dest_p.split(route.dest)[-1]
                
        #详细描述
        brief_temp = re.compile(u'''<p\s*class="blackFont"[^<>]*?>(?:&nbsp;)*\s*(.*?)(?:<br>)*\s*</p>''', re.X|re.S).search(parthtml)
        if brief_temp:
            schedule.s_brief = brief_temp.group(1).encode("utf-8")
            
        #早餐： 1有、0没有 
        meals =  re.compile(r'''<font\s*color=".961400">\s*(.*?)\s*</font>''', re.X|re.S).findall(parthtml)
        
        if meals:   
            schedule.s_brf = '0' if meals[0].strip() == '无餐' else '1'
            schedule.s_lunch = '0' if meals[1].strip() == '无餐' else '1'
            schedule.s_dinner = '0' if meals[2].strip() == '无餐' else '1'
        
            #酒店描述：可选       
            schedule._hotel = meals[3]
        route.schedules.append(schedule)
    return 

if __name__ == '__main__':
    do_crawl()



